#include <REGX52.H>

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;


/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_Start(void)
	{
		I2C_SDA=1;
		I2C_SCL=1;
    I2C_SDA=0;
		I2C_SCL=0;
  }
	
	
	/**
  * @brief  I2C停止
  * @param  无
  * @retval  无
  */
void I2C_Stop(void)
 {
   I2C_SDA=0;//先拉低SDA 保证在SCL高电平其期间 SDA从低电平到高电平
	 I2C_SCL=1;
	 I2C_SDA=1;
 }
 
 
 
 /**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char Byte)
 { 
   unsigned char i;
	 for(i=0;i<8;i++)
	    {
			  I2C_SDA=Byte&(0x80>>i);
				I2C_SCL=1;//拉高SCL再拉低SCL读取SDA数重复8次
				I2C_SCL=0;
			}
 }
 
 
 
 
 /**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
 unsigned char I2C_ReceiveByte(void)
 {
   unsigned char i, Byte=0x00;
	 I2C_SDA=1;//读取数据时先释放总线(高电平读取)
	 for(i=0;i<8;i++)
	 {
	 I2C_SCL=1;//把SCL拉高读取数据
	 if(I2C_SDA)
	  {
		 Byte|=(0x80>>i);
		}
		I2C_SCL=0;//把SCL拉低完成一个循环 循环8次
	 }
	 return Byte;
 }
 
 
 
 
 /**
  * @brief  I2C发送应答
  * @param  AckBit 应答位 0为应答 1为非应答
  * @retval 
  */
 void I2C_SendAck(unsigned char AckBit)
 {
   I2C_SDA=AckBit;
   I2C_SCL=1;//将SCL拉高再拉低读取应答
	 I2C_SCL=0;
 }
 
 
 
 
 /**
  * @brief  I2C接收应答
  * @param  无
 * @retval 接收到的应答 0为应答 1为非应答
  */
 unsigned char I2C_ReceiveAck(void)
 {
  unsigned char AckBit;
	 I2C_SDA=1;//释放总线
	 I2C_SCL=1;//高电平期间读取应答
	 AckBit=I2C_SDA;
	 I2C_SCL=0;//在拉低完活
	 return AckBit;//返回应答
 }